/**
 * 区域管理模块
 * 
 * 该模块负责区域数据的增删改查操作，包括省市区三级联动管理。
 * 所有API调用统一通过window.FreightApp.api进行，确保接口调用的一致性。
 * 
 * 主要功能：
 * - 区域数据查询（支持条件筛选和分级查询）
 * - 区域数据新增（支持省市区三级数据添加）
 * - 区域数据编辑和更新
 * - 区域数据删除（支持级联删除检查）
 * - 表单验证和数据格式化
 * 
 * API调用统一管理：
 * - 查询：window.FreightApp.api.getAreas()
 * - 新增：window.FreightApp.api.addArea()
 * - 更新：window.FreightApp.api.updateArea()
 * - 删除：window.FreightApp.api.deleteArea()
 * 
 * @author 运费系统团队
 * @version 2.0.0
 * @since 2025-08-29
 * @requires api.js - 统一API服务管理
 */

function useAreaManagement() {
    const { ref, reactive } = Vue;
    // 响应式数据
    const areas = ref([]);
    const submitting = ref(false);
    const showAddAreaModal = ref(false);
    const showEditAreaModal = ref(false);

    const areaForm = reactive({
        areaId: null,
        provinceCode: '',
        provinceName: '',
        provinceShortName: '',
        cityCode: '',
        cityName: '',
        cityShortName: '',
        districtCode: '',
        districtName: '',
        districtShortName: '',
        level: ''
    });

    // 区域查询条件
    const areaQuery = reactive({
        level: '', // 层级
        provinceName: '', // 省份
        cityName: '', // 城市
        districtName: '' // 区县
    });

    /**
     * 加载所有区域数据
     * 
     * 该方法支持按条件查询区域数据，包括按级别、省份、城市、区县等条件进行筛选。
     * 支持空查询结果的正确处理，确保用户界面展示的数据准确性。
     * 
     * 使用的API接口：GET /area/list
     * 
     * @param {Object|null} query - 查询条件，为null时使用默认查询条件
     * @param {string} [query.level] - 区域级别（1-省，2-市，3-区县）
     * @param {string} [query.provinceName] - 省份名称（模糊查询）
     * @param {string} [query.cityName] - 城市名称（模糊查询）
     * @param {string} [query.districtName] - 区县名称（模糊查询）
     * @returns {Promise<void>} 无返回值，直接更新areas响应式数据
     * 
     * @example
     * // 加载所有区域
     * await loadAreas();
     * 
     * // 按条件查询
     * await loadAreas({ level: '1' }); // 只查询省级数据
     * await loadAreas({ provinceName: '北京' }); // 查询北京相关区域
     */
    const loadAreas = async (query = null) => {
        try {
            const queryParams = query || areaQuery;
            console.log('加载区域数据，查询参数:', queryParams);
            const result = await window.FreightApp.window.FreightApp.api.getAreas(queryParams);
            console.log('区域查询结果:', result);
            if (result.code === 0) {
                // 总是更新数据，即使结果为空数组也要清除当前显示
                areas.value = result.data || [];
                console.log('加载区域成功，数量:', areas.value.length);
            } else {
                // API失败时也要清空数据
                areas.value = [];
                window.showMessage('加载区域失败: ' + result.msg, true);
            }
        } catch (err) {
            console.error('加载区域失败:', err);
            // 请求异常时也要清空数据
            areas.value = [];
            window.showMessage('加载区域失败', true);
        }
    };

    /**
     * 添加新区域
     */
    const addArea = () => {
        resetAreaForm();
        showAddAreaModal.value = true;
    };

    /**
     * 编辑现有区域
     */
    const editArea = (area) => {
        Object.assign(areaForm, area);
        // 确保层级是字符串类型以供选择组件使用
        areaForm.level = String(area.level || '');
        showEditAreaModal.value = true;
    };

    /**
     * 处理层级变更 - 清除依赖字段
     */
    const onLevelChange = () => {
        const level = parseInt(areaForm.level);

        // 当层级小于2时清除城市字段
        if (level < 2) {
            areaForm.cityCode = '';
            areaForm.cityName = '';
            areaForm.cityShortName = '';
        }

        // 当层级不等于3时清除区县字段
        if (level !== 3) {
            areaForm.districtCode = '';
            areaForm.districtName = '';
            areaForm.districtShortName = '';
        }
    };

    /**
     * 提交区域表单
     */
    const submitArea = async () => {
        const validation = validateAreaForm();
        if (!validation.isValid) {
            window.showMessage(validation.errors[0], true);
            return;
        }

        submitting.value = true;
        try {
            // API安全检查
            console.log('🔧 提交区域数据:', areaForm);
            console.log('🔧 API对象:', window.FreightApp.api);

            if (!window.FreightApp.api) {
                console.error('❌ API对象未正确导入到area-management.js');
                throw new Error('API对象未正确初始化，请刷新页面重试');
            }

            const isUpdate = Boolean(areaForm.areaId);
            const methodName = isUpdate ? 'updateArea' : 'addArea';
            window.FreightApp.apiMethod = window.FreightApp.api[methodName];

            console.log('🔧 选择的API方法:', methodName, '是否存在:', !!window.FreightApp.apiMethod);

            if (!window.FreightApp.apiMethod || typeof window.FreightApp.apiMethod !== 'function') {
                console.error(`❌ API方法 ${methodName} 不存在或不是函数`);
                throw new Error(`API方法 ${methodName} 不存在或不是函数，请检查window.FreightApp.api.js配置`);
            }

            const result = await window.FreightApp.apiMethod(areaForm);

            console.log('🔧 API调用结果:', result);

            if (result.code === 0) {
                window.showMessage('操作成功');
                closeAreaModal();
                loadAreas();
            } else {
                window.showMessage(result.msg || '操作失败', true);
            }
        } catch (err) {
            console.error('❌ 区域提交错误详情:', err);

            let errorMessage = '提交失败';

            if (err.message.includes('Cannot read properties of undefined')) {
                if (err.message.includes("reading 'post'")) {
                    errorMessage = 'API对象的post方法未正确初始化，请刷新页面重试';
                } else {
                    errorMessage = 'API对象未正确初始化，请刷新页面重试';
                }
            } else if (err.message.includes('is not a function')) {
                errorMessage = 'API方法不存在，请检查系统配置';
            } else {
                errorMessage = err.message || '未知错误';
            }

            window.showMessage(`提交失败: ${errorMessage}`, true);
        } finally {
            submitting.value = false;
        }
    };

    /**
     * 删除区域
     */
    const deleteArea = async (id) => {
        if (!confirm('确定要删除这个区域吗？')) return;

        try {
            const result = await window.FreightApp.api.deleteArea(id);
            if (result.code === 0) {
                window.showMessage('删除成功');
                loadAreas();
            } else {
                window.showMessage(result.msg || '删除失败', true);
            }
        } catch (err) {
            window.showMessage(err.message, true);
        }
    };

    /**
     * 关闭区域模态框
     */
    const closeAreaModal = () => {
        showAddAreaModal.value = false;
        showEditAreaModal.value = false;
        resetAreaForm();
    };

    /**
     * 重置区域表单
     */
    const resetAreaForm = () => {
        Object.assign(areaForm, {
            areaId: null,
            provinceCode: '',
            provinceName: '',
            provinceShortName: '',
            cityCode: '',
            cityName: '',
            cityShortName: '',
            districtCode: '',
            districtName: '',
            districtShortName: '',
            level: ''
        });
    };

    /**
     * 验证区域表单
     */
    const validateAreaForm = () => {
        const errors = [];
        const level = parseInt(areaForm.level);

        if (!level || level < 1 || level > 3) {
            errors.push('请选择有效的地址层级');
        }

        // 省份总是必填的
        if (!areaForm.provinceCode) errors.push('省份编码不能为空');
        if (!areaForm.provinceName) errors.push('省份全称不能为空');
        if (!areaForm.provinceShortName) errors.push('省份简称不能为空');

        // 城市在层级>=2时是必填的
        if (level >= 2) {
            if (!areaForm.cityCode) errors.push('城市编码不能为空');
            if (!areaForm.cityName) errors.push('城市全称不能为空');
            if (!areaForm.cityShortName) errors.push('城市简称不能为空');
        }

        // 区县在层级=3时是必填的
        if (level === 3) {
            if (!areaForm.districtCode) errors.push('区县编码不能为空');
            if (!areaForm.districtName) errors.push('区县全称不能为空');
            if (!areaForm.districtShortName) errors.push('区县简称不能为空');
        }

        return {
            isValid: errors.length === 0,
            errors
        };
    };

    /**
     * 获取区域层级名称
     */
    const getAreaLevelName = (level) => {
        const levelMap = {
            1: '省级',
            2: '市级',
            3: '区县级'
        };
        return levelMap[level] || '未知';
    };

    /**
     * 获取区域状态文本
     */
    const getAreaStatusText = (status) => {
        return status === 1 ? '启用' : '禁用';
    };

    /**
     * 获取区域状态类
     */
    const getAreaStatusClass = (status) => {
        return status === 1 ? 'status-active' : 'status-inactive';
    };

    /**
     * 搜索区域
     */
    const searchAreas = async () => {
        try {
            console.log('执行区域查询，查询条件:', areaQuery);
            await loadAreas(areaQuery);
            const resultCount = areas.value.length;
            console.log('区域查询完成，结果数量:', resultCount);
            window.showMessage(`查询成功，找到 ${resultCount} 条记录`);
        } catch (err) {
            console.error('区域查询失败:', err);
            window.showMessage('查询失败', true);
        }
    };

    /**
     * 重置搜索条件
     */
    const resetAreaQuery = async () => {
        Object.assign(areaQuery, {
            level: '',
            provinceName: '',
            cityName: '',
            districtName: ''
        });
        console.log('重置区域查询条件，重新加载所有数据');
        await loadAreas();
        window.showMessage('已重置查询条件');
    };

    /**
     * 根据关键字搜索区域
     */
    const searchAreasByKeyword = (keyword) => {
        if (!keyword) return areas.value || [];

        const lowerKeyword = keyword.toLowerCase();
        return (areas.value || []).filter(area => {
            return (area.provinceName && area.provinceName.toLowerCase().includes(lowerKeyword)) ||
                   (area.cityName && area.cityName.toLowerCase().includes(lowerKeyword)) ||
                   (area.districtName && area.districtName.toLowerCase().includes(lowerKeyword));
        });
    };

    /**
     * 根据层级筛选区域
     */
    const filterAreasByLevel = (level) => {
        if (!level) return areas.value || [];
        return (areas.value || []).filter(area => area.level === level);
    };

    return {
        // State
        areas,
        submitting,
        showAddAreaModal,
        showEditAreaModal,
        areaForm,
        areaQuery,

        // Methods
        loadAreas,
        searchAreas,
        resetAreaQuery,
        addArea,
        editArea,
        onLevelChange,
        submitArea,
        deleteArea,
        closeAreaModal,
        resetAreaForm,
        validateAreaForm,
        getAreaLevelName,
        getAreaStatusText,
        getAreaStatusClass,
        searchAreasByKeyword,
        filterAreasByLevel
    };
}
